package com.emato.cus.task;

import com.emato.cus.config.InterCusConfig;
import com.emato.cus.controller.CusHeartRateMonitorController;
import com.emato.cus.dto.CusHeartRateInfoDto;
import com.emato.cus.util.DateUtil;
import com.emato.cus.util.SendMsgUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author hhq
 * @version 1.0.0
 * 2020/6/30
 */
@Component
@EnableScheduling
public class TaskTest  {
    private static final Logger LOGGER = LoggerFactory.getLogger(TaskTest.class);

    @Autowired
    private InterCusConfig interCusConfig;  //短信配置

    public static final long TASK_TIME = 3*1000;   //扫描时间

//    @Scheduled(fixedRate = TASK_TIME)
    public void scanController(){
        LOGGER.info("===========定时扫描开始===========");
        LOGGER.info("扫描服务器个数:【{}】个",CusHeartRateMonitorController.map.size());
        if(CusHeartRateMonitorController.map.size()==0){
            LOGGER.info("===========定时扫描结束==========^\n\n");
            return;
        }

        //记录需要清空的服务器key
        List<String> mapRemoveKey =new ArrayList<String>();
        //循环扫描所有服务器
        for(Map.Entry<String, CusHeartRateInfoDto> entry : CusHeartRateMonitorController.map.entrySet()){
            //扫描器开始时间
            long currentTime = new Date().getTime();

            CusHeartRateInfoDto value = entry.getValue();
            LOGGER.info("*********当前扫描服务器port:【{}】*********",entry.getKey());
            //间隔时间
            long requestIntervalTime = value.getRequestIntervalTime();
            //第二次超时-第四次超时,扫描时间延长
            if(value.isRequest()==true && value.getTimeoutCount()>0 && value.getTimeoutCount()<4){

                //当前时间小于延迟扫描时间 停止本次超时扫描
                if(currentTime < value.getDelayScanTime()){
                    String time = DateUtil.dateConvertString(new Date(value.getDelayScanTime()), "yyyy-MM-dd HH:mm:ss");
                    LOGGER.info("当前扫描服务器port:【{}】已经超时，次数{}，正在延迟扫描，下次扫描时间：{}",entry.getKey(),value.getTimeoutCount(),time);
                    LOGGER.info("*********扫描服务器port: 【{}】完毕*********\n",entry.getKey());
                    //结束当前循环
                    continue;
                }

                //延迟时间配置
                long sTime = value.getTimeoutCount()*5;
                //当前时间+延迟时间+requestIntervalTime
                value.setDelayScanTime(currentTime+sTime*1000+requestIntervalTime);
                if(value.getTimeoutCount()<4){
                    LOGGER.info("下次扫描延迟【{}】秒",sTime);
                }

            }

            //t:当前时间-定时任务时间 的 时间差
            long t =currentTime - requestIntervalTime;
            LOGGER.info("扫描时间：{},最后一次请求时间: {}",
                        DateUtil.dateConvertString(new Date(currentTime), "yyyy-MM-dd HH:mm:ss"),
                        DateUtil.dateConvertString(new Date(value.getRequestTime()), "yyyy-MM-dd HH:mm:ss"));

            //心跳请求异常，超时处理
            if(value.isRequest() == true){
                //超时次数加一
                value.setTimeoutCount(value.getTimeoutCount()+1);
                LOGGER.error("心跳请求超时,port:{},超时次数:{}",value.getPort(),value.getTimeoutCount());

                // 连续3次扫描超时，则发送短信信息
                if (value.getTimeoutCount() > 3){
//                    LOGGER.error("port:{},超时次数超过3次",value.getPort() );
                    //短信次数超过三次不再发送
                    if(value.getSendCount() <= 3){
                        //当前时间超过发送短信时间则发送短信
                        if(currentTime > value.getSendSMSTime()){

                            //发送短信次数加 1
                            value.setSendCount(value.getSendCount()+1);

                            LOGGER.info("第{}次发送短信",value.getSendCount());
                            String errMsg = "";
                            //替换模板
                            String msg = interCusConfig.getLoginErrorMessage()
                                                       .replace("DATE", DateUtil
                                                               .dateConvertString(new Date(), "yyyy-MM-dd HH:mm:ss"))
                                                       .replace("SERVER", Integer.parseInt(value.getPort()) == 50080 ? "1#服务器" : "2#服务器")
                                                       .replace("PORT", value.getPort())
                                                       .replace("ERRMSG", "服务器心跳超时，请及时处理异常");

                            //第一次发送短信后间隔2分钟,第二次间隔4分钟
                            long intervalTime= 2;
                            if(interCusConfig.getLoginErrorTime()==null||interCusConfig.getLoginErrorTime().equals("")){
                                intervalTime= (value.getSendCount())*2;
                            }else{
                                intervalTime= (value.getSendCount())*Integer.parseInt(interCusConfig.getLoginErrorTime());
                            }

                            if(value.getSendCount() < 3) {
                                LOGGER.info("下次发送短信时间间隔【{}】分钟", intervalTime );
                            }
                            value.setSendSMSTime(new Date().getTime()+ intervalTime*60*1000);
//                            value.setSendSMSTime(new Date().getTime()+ intervalTime*10*1000);

                            //发送短信
                            LOGGER.info("【互联网+海关】心跳异常，短信内容：{}，发送短信结果：{}",
                                        msg, SendMsgUtil.sendMsg(interCusConfig.getLoginErrorMobile(), msg));
//                            LOGGER.info(msg);

                            //第三次添加到map移除
                            if(value.getSendCount() == 3) {
                                mapRemoveKey.add(value.getPort());
                            }
                        }
                    }
                }
            }else{
                if(value.getTimeoutCount()>0){
                    LOGGER.info("清空超时次数,当前超时次数{}",value.getTimeoutCount());
                }
                value.setTimeoutCount(0);
                value.setSendCount(0);
                value.setDelayScanTime(0);
                value.setSendSMSTime(0);
            }

            //当前时间-定时任务时间 大于 最后一次请求时间，判断客户端异常
            if(t > value.getRequestTime()+500){
                value.setRequest( true);
            }

            LOGGER.info("*********扫描服务器port: 【{}】完毕*********\n\n",entry.getKey());

        }

        //移除需要扫描的服务器
        for(String key : mapRemoveKey){
            if(CusHeartRateMonitorController.map.get(key)!=null){
                LOGGER.info("已从扫描map移除port:【{}】 服务器",key);
                CusHeartRateMonitorController.map.remove(key);
            }
        }
        mapRemoveKey.clear();
        LOGGER.info("===========定时扫描完毕===========\n\n");
    }
}
